home *** CD-ROM | disk | FTP | other *** search
/ Games of Daze / Infomagic - Games of Daze (Summer 1995) (Disc 1 of 2).iso / x2ftp / msdos / progsrc / v3dt090 / 3dtools.h < prev    next >
C/C++ Source or Header  |  1994-10-07  |  5KB  |  289 lines

  1. #ifndef _3DTOOLS_H
  2. #define _3DTOOLS_H
  3.  
  4. #include <math.h>
  5. #include <stdio.h>
  6. #include <stdlib.h>
  7. #include "mode13h.h"
  8. #include "sin.h"
  9.  
  10. #define DIST 1024       // distance between the monitor and the eye, in pixels
  11. #define MAX_XYZ 2097151 // max value in any direction (x, y, z)
  12.  
  13. typedef struct
  14. {
  15.    long localX, localY, localZ;
  16.  
  17. } pointRec;
  18.  
  19. class point3d
  20. {
  21.  
  22. public:
  23.  
  24.     long x3d, y3d, z3d;
  25.     long localX, localY, localZ, rotoX, rotoY, rotoZ;
  26.     long oX, oY, oZ;
  27.     long x2d, y2d;
  28.     long nX, nY, nZ, nCount;
  29.     void *normal;
  30.  
  31.     // spherical coordinate implementation -
  32.     // rho   = sqrt(x3d^2 + y3d^2 + z3d^2) = distance
  33.     // phi   = arccos(y3d / rho) = angle of elevation
  34.     // theta = arctan(x3d / z3d) = angle in the XZ plane (yaw)
  35.     // l and g prefixes denote local and global coordinates
  36.     //
  37.     // x = p(sin φ)(cos Θ)
  38.     // y = p(cos φ)
  39.     // z = p(sin φ)(sin Θ)
  40.     //
  41.     // as you can see this is about half the imuls of the conventional method
  42.     // and should also result in SMALLER POINT OBJECTS (just for you, Hurri)
  43.  
  44.     // long lRho, lPhi, lTheta, gRho, gPhi, gTheta;
  45.  
  46.     point3d();
  47.     point3d(long x, long y, long z);
  48.  
  49.     void save(FILE *fp);
  50.     void load(FILE *fp);
  51.  
  52.     void setTo(long x, long y, long z);
  53.  
  54.     void xform2d();
  55.     void display(int color);
  56.     void setNewOrigin(point3d *p);
  57.     void globalXform2origin(point3d *p);
  58.     void copyOrigin(point3d *p);
  59.  
  60.     void localRotate(int dTheta, int dPhi);
  61.     void localRotate(int tX, int tY, int tZ);
  62.     void localRotate(int *trig);
  63.     void globalRotate(int *trig);
  64.  
  65.     void translate(long dX, long dY, long dZ);
  66.     void globalXform();
  67.  
  68.     void zeroNormal();
  69.     void addNormal(int dX, int dY, int dZ);
  70.     void avgNormal();
  71.  
  72.     ~point3d();
  73.  
  74. private:
  75.  
  76.     long i, j, k;
  77.     int xDeg, yDeg, zDeg;
  78.  
  79.  
  80. };
  81.  
  82. int dotProduct(point3d *p1, point3d *p2);
  83.  
  84.  
  85. class line3d
  86. {
  87.  
  88. public:
  89.  
  90.     line3d(point3d *p1, point3d *p2, int c);
  91.  
  92.     line3d(long x1, long y1, long z1, long x2, long y2, long z2, int c);
  93.  
  94.     void draw();
  95.  
  96.     void calcVectors();
  97.  
  98.     long xOfT(double t);
  99.  
  100.  
  101.     long yOfT(double t);
  102.  
  103.     long zOfT(double t);
  104.  
  105.     double tOfX(long x);
  106.  
  107.     double tOfY(long y);
  108.  
  109.     double tOfZ(long z);
  110.  
  111.     void localRotate(double tX, double tY, double tZ);
  112.  
  113.     ~line3d();
  114.  
  115. private:
  116.  
  117.     point3d *point1, *point2;
  118.     int color, flag;
  119.     long i, j, k;
  120.  
  121. };
  122.  
  123. typedef struct
  124. {
  125.  
  126.     int p1, p2, p3, normal, color;
  127.  
  128. } polyRec;
  129.  
  130. #define sNone       0
  131. #define sFlat       1
  132. #define sGouraud    2
  133.  
  134. #define fBoth       0
  135. #define fInside     1
  136. #define fOutside    2
  137.  
  138. class polygon
  139. {
  140.  
  141. public:
  142.     point3d *p1, *p2, *p3, *normal;
  143.     int color;
  144.     int facing, shading;
  145.  
  146.     polygon();
  147.  
  148.     polygon(point3d *v1, point3d *v2, point3d *v3, int c);
  149.     polygon(point3d *v1, point3d *v2, point3d *v3, point3d *norm, int c);
  150.  
  151.     void setTo(point3d *v1, point3d *v2, point3d *v3);
  152.  
  153.     long avgZ();
  154.  
  155.     void setColor(int c);
  156.  
  157.     void wireFrame();
  158.     void paintSolid();
  159.     void gShade();
  160.  
  161.     void setNewOrigin(point3d *p);
  162.  
  163.     void localRotate(int *trig);
  164.     void globalRotate(int *trig);
  165.  
  166.     void setGNormals();
  167.  
  168.     void setShading(int shade);
  169.     void setFacing(int face);
  170.     void display();
  171.  
  172.     ~polygon();
  173.  
  174. private:
  175.     line3d **line;
  176.     int count, dot;
  177.  
  178. };
  179.  
  180. typedef struct
  181. {
  182.     char OTMtag[18];
  183.     char newline[1];
  184.     int numPoints, numPolys;
  185.  
  186. } objFileHeader;
  187.  
  188.  
  189. class obj3d
  190. {
  191.  
  192. public:
  193.  
  194.     obj3d(long x, long y, long z);
  195.  
  196.     void save(FILE *fp);
  197.     void load(FILE *fp);
  198.  
  199.     void addLocalPoint(long x, long y, long z);
  200.     void addLocalPoint(point3d *p);
  201.  
  202.     void addGlobalPoint(long x, long y, long z);
  203.     void addGlobalPoint(point3d *p);
  204.  
  205.     void addLocalPoly(polygon *pg);
  206.     void addLocalPoly(int p1, int p2, int p3, int c);
  207.  
  208.     void addGlobalPoly(polygon *pg);
  209.  
  210.     int getPointNum(long x, long y, long z);
  211.     int getPointNum(point3d *p);
  212.  
  213.     void localRotate(int dTheta, int dPhi);
  214.     void localRotate(int tX, int tY, int tZ);
  215.     void globalRotate(int *trig);
  216.  
  217.     void translate(int dX, int dY, int dZ);
  218.  
  219.     void sortPlanes();
  220.  
  221.     void paintDots();
  222.     void wireFrame();
  223.     void paintSolid();
  224.     void gShade();
  225.  
  226.     void setLocation(long x, long y, long z);
  227.  
  228.     void setGNormals();
  229.     void display();
  230.  
  231.     ~obj3d();
  232.  
  233.     point3d  **point;
  234.     polygon  **poly;
  235.     int numPoints, numPolys, count, xDeg, yDeg, zDeg;
  236.  
  237. private:
  238.  
  239.     point3d *origin;
  240.     line3d *xAxis, *yAxis, *zAxis;
  241.     int *trig;
  242.  
  243. };
  244.  
  245. #define MAX_OBJS 128
  246.  
  247. class world3d
  248. {
  249.  
  250. public:
  251.  
  252.     world3d();
  253.  
  254.     void rotate(int tX, int tY, int tZ);
  255.  
  256.     ~world3d();
  257.  
  258. private:
  259.  
  260.     obj3d **object;
  261.     int numObjs;
  262.  
  263. };
  264.  
  265. extern world3d world;
  266.  
  267. class viewPoint
  268. {
  269.  
  270. public:
  271.  
  272.     point3d *location, *light, *view;
  273.  
  274.     viewPoint();
  275.  
  276.     void rotate(int tX, int tY, int tZ);
  277.     void translate(int dX, int dY, int dZ);
  278.  
  279.     ~viewPoint();
  280.  
  281. private:
  282.  
  283.  
  284. };
  285.  
  286. extern viewPoint camera;
  287.  
  288. #endif
  289.